home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
IRIX Installation Tools & Overlays 2002 November
/
SGI IRIX Installation Tools & Overlays 2002 November - Disc 4.iso
/
dist
/
insight_base.idb
/
usr
/
sbin
/
insightAdmin.z
/
insightAdmin
Wrap
Text File
|
2002-10-15
|
19KB
|
773 lines
#!/usr/bin/perl
#
# Copyright 2002, Silicon Graphics, Inc.
# All Rights Reserved.
#
# This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
# the contents of this file may not be disclosed to third parties, copied or
# duplicated in any form, in whole or in part, without the prior written
# permission of Silicon Graphics, Inc.
#
# RESTRICTED RIGHTS LEGEND:
# Use, duplication or disclosure by the Government is subject to restrictions
# as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
# and Computer Software clause at DFARS 252.227-7013, and/or in similar or
# successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
# rights reserved under the Copyright Laws of the United States.
#
# ----------------------
# insightAdmin (Insight)
# ----------------------
# syntax:
#
# insightAdmin [-c] [-d] [-v] [-h] [ <bookshelf> ]
# ex: insightAdmin /usr/share/Insight/library/SGI_bookshelves/SGI_EndUser
#
$| = 1;
my($_VRS) = 'v5.1';
my(@_bkshlfs) = ();
my($_lpth) = '/usr/share/Insight/library/SGI_bookshelves';
my($_url) = 'http://techpubs.sgi.com/bkdl.cgi';
my($_lang) = 'C';
my($_ebt2html)= '/usr/share/Insight/bin/ebt2html';
my($_verbose, $_correct, $_dl) = 0;
my(%_strs) = (
# shelf titles, etc
'SGI_EndUser' => 'End-User',
'SGI_Admin' => 'Administrative',
'SGI_Developer' => 'Developer',
'SGI_Service' => 'Service',
'Help' => 'Application Help',
'ISV_Help' => '3rd Party Application Help',
# html
'html_ftr' => "</p>\n</body></html>\n",
# error/misc strings
'err_inv_s' => 'invalid bookshelf',
'err_inv_s_c' => 'invalid bookshelf; cannot correct',
'err_no_s' => 'no bookshelves found; cannot process default',
'pr' => 'processing',
'add' => 'adding',
'warn' => 'WARNING',
'err' => 'ERROR',
'old_form1' => "appears to be in old/unreadable format\n\t\t\t (see -c and -d options)\n",
'old_form2' => '(old/unreadable format)',
'pdf_form' => "is only available in PDF\n",
'pdf' => 'PDF copy',
'dn' => 'document number',
'dl' => 'downloading',
'err_dl' => 'ERROR downloading',
'cv' => 'converting',
'err_cv' => 'ERROR converting',
'err_wr' => 'cannot write to',
'rt' => 'return to',
'list_s' => 'List of Bookshelves'
);
#----------------------
# read in cmd-line args
#
while ((@ARGV + 0) > 0) {
if ($ARGV[0] =~ /^\-/) {
if ($ARGV[0] =~ /v/i) {
$_verbose = 1; # (v)erbose mode
}
if ($ARGV[0] =~ /h/i) {
&usage(''); # (h)elp/usage
}
if ($ARGV[0] =~ /c/i) {
$_correct = 1; # (c)orrect old books
}
if ($ARGV[0] =~ /d/i) {
$_dl = 1; # use net to (d)ownload new format bks
}
if ($ARGV[0] =~ /n/i) {
shift(@ARGV);
$_lang = $ARGV[0]; # lang variable; not public
}
} else {
if (-d $ARGV[0] && -d "$ARGV[0]/books") {
push(@_bkshlfs, $ARGV[0]);
} else {
&usage("$_strs{'err_inv_s'} ($ARGV[0])");
}
}
shift(@ARGV);
}
if ($_dl == 1) {
my($e_str) = $ENV{TPL_SERVER};
if ($e_str ne '') {
$_url =~ s/\/\/[^\/]+\//\/\/${e_str}\//;
}
}
#---------------------------------------------------------
# set the proper locale for us to work in...
#
# LC_CTYPE needed for uc{first}, lc{first}
# LC_COLLATE needed for lt, le, cmp, ge, gt, strcoll, sort
#
use locale;
use POSIX qw(locale_h);
use POSIX qw(strcoll);
if ($_lang ne '') {
if (!(setlocale(LC_CTYPE, $_lang))) {
# on error, set to 'C'
#
$_lang = 'C';
setlocale(LC_CTYPE, $_lang);
}
setlocale(LC_COLLATE, $_lang);
}
#-----------------------------------------------------------
# use a default...all bookshelves under default library path
#
if ((@_bkshlfs+0) == 0) {
opendir(LDIR, "${_lpth}") || &usage("$_strs{'err_no_s'} (${_lpth}");
foreach (readdir(LDIR)) {
if ($_ !~ /^\./ && -d "${_lpth}/${_}/books") {
push(@_bkshlfs, "${_lpth}/${_}");
}
}
closedir (LDIR);
if ((@_bkshlfs+0) == 0) {
&usage("$_strs{'err_no_s'} (${_lpth}");
}
}
#-------------------
# open html template
#
$_hdr = '';
while(<DATA>) {
$_hdr .= $_;
}
close(DATA);
#------------------------
# process the bookshelves
#
foreach (@_bkshlfs) {
if ($_verbose) {
print "\ninsightAdmin ($_VRS): $_strs{'pr'} ${_}\n\n";
}
if ($_correct == 1) {
&correct_bookshelf($_);
}
&update_bookshelf($_);
}
#------------------------------------
# add a library-level index.html file
#
&add_lib_html($_bkshlfs[0]);
exit(0);
#------------------------------------------------------------
# update_bookshelf(string bkshlf)
#
# create/write to booklist.txt and top-level index.html file
#
sub update_bookshelf {
my($bkshlf) = @_;
if ($bkshlf eq '' || !(-d "$bkshlf")) {
&usage("$_strs{'err_inv_s'} (${bkshlf})");
}
my($shlf_name) = ($bkshlf =~ m#/([^/]+)$#s);
#-----------------------------------------------------
# prepare list of books to process/add to booklist.txt
#
my($s, $pth, $tmp, $bk, $dn, $btype, $ttl, $html, $pdf) = '';
my(%books) = ();
opendir(BKDIR, "${bkshlf}/books") ||
&usage("$_strs{'err_inv_s'} (${bkshlf})");
foreach $s (readdir(BKDIR)) {
if ($s =~ /^\./) {
next;
}
$bk = $s;
($dn, $ttl, $btype) = '';
if ($_verbose) {
print " $_strs{'add'} $bk...\n";
}
#-----------------------------
# use existing booklist.txt...
#
if (-r "${bkshlf}/books/${s}/booklist.txt") {
open(BKL, "${bkshlf}/books/${s}/booklist.txt");
$tmp = join('', <BKL>);
close(BKL);
$tmp =~ s/<COLLECTION>\n//i;
$tmp =~ s/<\/COLLECTION>\n//i;
if( $tmp !~ /<\/BOOK>\n$/i ) {
$tmp .= "</BOOK>\n";
}
if( $tmp =~ /.*(\d\d\d-\d\d\d\d-\d\d\d[a-zA-Z]*).*/ ) {
$dn = $1;
}
if( $tmp =~ /ALIAS[\ \=]+\"([^\"]+)\"/i ) {
$ttl = $1;
}
if( $tmp =~ /GROUP[\ \=]+\"([^\"]+)\"/i ) {
$btype = $1;
}
#-----------------
# ...or create one
#
} else {
$dn = '';
if (-l "${bkshlf}/books/$s") {
$tmp = `ls -l ${bkshlf}/books/${s}`;
if ($tmp =~ /.*(\d\d\d-\d\d\d\d-\d\d\d[a-zA-Z]*).*/) {
$dn = $1;
}
}
$ttl = $s;
$tmp = "<BOOK NAME=\"" . $s . "\" ALIAS=\"" . $s . "\"" .
($dn ne '' ? " SGIVERSION=\"${dn}\"" : '') .
">\n</BOOK>\n";
}
if ($_verbose) {
if ($btype !~ /html/i && &check_book($bkshlf, $bk) == 0) {
print " ", $_strs{'warn'}, ": $bk ",
(&check_pdf($bkshlf, $bk) == 1 ?
$_strs{'pdf_form'} : $_strs{'old_form1'});
}
}
($pth, $pdf) = '';
if (-e "${bkshlf}/books/${bk}/sgi_html/index.html") {
$pth = "<a href=\"books/${bk}/sgi_html/index.html\">";
} elsif(-e "${bkshlf}/books/${bk}/index.html") {
$pth = "<a href=\"books/${bk}/index.html\">";
} elsif(-d "${bkshlf}/books/${bk}/sgi_html") {
$pth = "<a href=\"books/${bk}/sgi_html/\">";
}
if (-e "${bkshlf}/books/${bk}/pdf/${bk}.pdf") {
$pdf = "<a href=\"books/${bk}/pdf/${bk}.pdf\">";
} elsif(-e "${bkshlf}/books/${bk}/${bk}.pdf") {
$pdf = "<a href=\"books/${bk}/${bk}.pdf\">";
}
$html = "<li>${pth}<b>" . ($ttl ne '' ? "$ttl" : "$s") . "</b>";
if ($pth ne '') {
$html .= "</a>";
} elsif ($pdf eq '') {
$html .= " <i>$_strs{'old_form2'}</i>";
}
if ($pdf ne '') {
$html .= " ${pdf}$_strs{'pdf'}</a>";
}
$html .= ($dn ne '' ? "<br><i>($_strs{'dn'}: ${dn})</i>" : '') .
"</li>\n";
$books{$s} = { 'title' => $ttl,
'booklist' => $tmp,
'html' => $html
};
#------------------------
# clean-up 0-length files
#
&clean_bookdir("${bkshlf}/books/${bk}", "${bk}");
}
closedir(BKDIR);
#---------------------------------------------------------------
# sort the books by title and create booklist.txt and index.html
#
open(FP_BKLIST, "> ${bkshlf}/booklist.txt") || do {
&usage("$_strs{'err_wr'} ${bkshlf}/booklist.txt");
};
open(FP_BKHTML, "> ${bkshlf}/index.html") || do {
&usage("$_strs{'err_wr'} ${bkshlf}/index.html");
};
print FP_BKLIST "<COLLECTION>\n";
print FP_BKHTML &do_html(($_strs{$shlf_name} ne '' ?
$_strs{$shlf_name} : ${shlf_name})),
"<p>($_strs{'rt'} <a href=\"../index.html\">",
lc($_strs{'list_s'}), "</a>)</p>\n<p><ul>\n";
foreach $book
(sort { lc($books{$a}->{'title'}) cmp lc($books{$b}->{'title'}) }
(keys(%books))) {
print FP_BKLIST $books{$book}->{'booklist'};
print FP_BKHTML $books{$book}->{'html'};
}
print FP_BKLIST "</COLLECTION>\n";
print FP_BKHTML "</ul>", $_strs{'html_ftr'};
close(FP_BKLIST);
close(FP_BKHTML);
}
#---------------------------------------------------
# correct_bookshelf(string bkshlf)
#
# check for old books, update to new format w/tools
#
sub correct_bookshelf {
my($bkshlf) = @_;
if ($bkshlf eq '' || !(-d "$bkshlf")) {
&usage("$_strs{'err_inv_s_c'} (${bkshlf})");
}
my($shlf_name) = ($bkshlf =~ m#/([^/]+)$#s);
#------------
# check books
#
my($s, $tmp, $bk, $dn, $btype) = '';
my($ok) = 0;
opendir(BKDIR, "${bkshlf}/books") ||
&usage("$_strs{'err_inv_s'} (${bkshlf})");
foreach $s (readdir(BKDIR)) {
if ($s =~ /^\./) {
next;
}
#--------------
# in new format
#
if (&check_book($bkshlf, $s) == 1) {
next;
}
($dn, $btype, $pth) = '';
#-----------------------------------
# query booklist.txt for part number
#
if (-r "${bkshlf}/books/${s}/booklist.txt") {
open(BKL, "${bkshlf}/books/${s}/booklist.txt");
$tmp = join('', <BKL>);
close(BKL);
if ($tmp =~ /.*(\d\d\d-\d\d\d\d-\d\d\d[a-zA-Z]*).*/) {
$dn = $1;
}
if( $tmp =~ /GROUP[\ \=]+\"([^\"]+)\"/i ) {
$btype = $1;
}
}
if ($btype =~ /html/i) {
next; # ignore (old) HTML books
}
if ($dn eq '') {
$dn = "${shlf_name}/${s}";
}
#-------------------------------
# perform conversion or download
#
$ok = 0;
if ($_dl == 1) {
if ($_verbose) {
print " ",
"$_strs{'dl'} ${shlf_name}/books/${s}...\n";
}
if (($ok = &download_book($bkshlf, $s, $dn)) == -1) {
print " ",
"$_strs{'err_dl'} ${shlf_name}/books/${s}\n";
}
}
if ($ok <= 0) {
#----------------------
# use filter conversion
#
if ($_verbose) {
print " $_strs{'cv'} ${shlf_name}/books/${s}...\n";
}
if (($ok = &convert_book($bkshlf, $s)) == -1) {
print " $_strs{'err_cv'} ${shlf_name}/books/${s}\n";
}
}
}
closedir(BKDIR);
}
#--------------------------------------------------------
# download_book (string bkshlf, string bk, string docnum)
#
# fetch a book from techpubs.sgi.com
#
sub download_book {
my($bkshlf, $bk, $dn) = @_;
#---------------------------------------------
# geturl does a fetch, returns a temp filename
#
my($tmp) = `geturl '${_url}/${dn}'`;
if ($? || !(-r "${tmp}")) {
return -1;
}
if (int((-s "${tmp}")) < 500) {
system("rm -f ${tmp}");
return -1;
}
if (!(-d "${bkshlf}/books/.sgitmp")) {
if (!(mkdir("${bkshlf}/books/.sgitmp", 0755))) {
return -1;
}
} else {
system("rm -rf ${bkshlf}/books/.sgitmp/*");
if ($?) {
return -1;
}
}
my($cmd) = "(mv -f ${tmp} ${tmp}.gz; ".
" gunzip -f -q ${tmp}.gz; " .
" cd ${bkshlf}/books/.sgitmp; " .
" tar -xf ${tmp}; " .
" rm -f ${tmp})";
system("$cmd");
if ($?) {
system("rm -rf ${bkshlf}/books/.sgitmp");
return -1;
}
$tmp = `ls -1 ${bkshlf}/books/.sgitmp`;
$tmp =~ s/\n$//g;
if (-d "${bkshlf}/books/.sgitmp/${tmp}") {
$cmd = "(mv -f ${bkshlf}/books/${bk} ${bkshlf}/books/${bk}.O; " .
" mv -f ${bkshlf}/books/.sgitmp/${tmp} ${bkshlf}/books/${bk})";
system("$cmd");
#--------------
# recovery step
#
if ($?) {
if (-d "${bkshlf}/books/${bk}.O") {
$cmd = "(mv -f ${bkshlf}/books/${bk}.O ${bkshlf}/books/${bk}; " .
" rm -rf ${bkshlf}/books/.sgitmp)";
system("$cmd");
}
return -1;
}
if (-d "${bkshlf}/books/${bk}.O") {
system("rm -rf ${bkshlf}/books/${bk}.O");
}
}
system("rm -rf ${bkshlf}/books/.sgitmp");
return 1;
}
#---------------------------------------
# convert_book(string bkshlf, string bk)
#
# filter/convert book to new format
#
sub convert_book {
my($bkshlf, $bk) = @_;
if ($bkshlf eq '' || $bk eq '' || !(-d "${bkshlf}/books/${bk}")) {
return -1;
}
my($cmd) = $_ebt2html . ($_verbose ? ' -v' : '') . " $bkshlf $bk";
$result = system($cmd);
return ($result);
}
#--------------------------------------------
# add_lib_html(string bkshlf)
#
# create top-level (library) index.html file
#
sub add_lib_html {
my($bkshlf) = @_;
my($lib) = $bkshlf;
$lib =~ s/[^\/]+$//;
if ($lib eq '' || !(-d "$lib")) {
return;
}
opendir(LIBDIR, "${lib}") || return;
open(FLIBHTML, "> ${lib}/index.html") || return;
print FLIBHTML &do_html($_strs{'list_s'}), "\n<p><ul>\n";
foreach (readdir(LIBDIR)) {
if ($_ =~ /^\./
|| !(-f "${lib}${_}/booklist.txt")
|| !(-f "${lib}${_}/index.html")) {
next;
}
print FLIBHTML "<li><a href=\"${_}/index.html\"><b>",
($_strs{$_} ne '' ? $_strs{$_} : ${_}), "</b></a></li>\n";
}
closedir(LIBDIR);
print FLIBHTML "</ul>", $_strs{'html_ftr'};
close(FLIBHTML);
}
#---------------------------------------
# check_book(string bkshlf, string bk)
#
# check to see if book is in old format
#
sub check_book {
my($bkshlf, $bk) = @_;
if ($bkshlf eq '' || $bk eq '' || !(-d "${bkshlf}/books/${bk}")) {
return 0;
}
#--------------
# in new format
#
if (-d "${bkshlf}/books/${bk}/sgi_data"
&&
-f "${bkshlf}/books/${bk}/sgi_html/index.html") {
return 1;
}
return 0;
}
#------------------------------------
# check_pdf(string bkshlf, string bk)
#
# check to see if book is in PDF
#
sub check_pdf {
my($bkshlf, $bk) = @_;
if ($bkshlf eq '' || $bk eq '' || !(-d "${bkshlf}/books/${bk}")) {
return 0;
}
#--------------
# in PDF format
#
if (-d "${bkshlf}/books/${bk}/pdf"
&&
(-f "${bkshlf}/books/${bk}/pdf/${bk}.pdf"
||
-f "${bkshlf}/books/${bk}/${bk}.pdf")) {
return 1;
}
return 0;
}
#---------------------------------
# clean_bookdir(string bk_dir, bk)
#
# remove zero-length files/cruft
#
sub clean_bookdir {
my($bk_dir, $bk) = @_;
if ($bk_dir eq '' || !(-d "${bk_dir}")) {
return;
}
my($s, $tmp) = '';
#----------------------
# remove 0-length files
#
foreach $s (split(/\n/, `(find ${bk_dir} -type f -size 0 -print)`)) {
unlink($s); # ignore errors
}
#-------------------------
# remove empty directories
# - use streamlined method
#
# @ents = split(/\n/, `(cd ${bk_dir}; find . -type d -print)`);
#
my(@ents) = ("${bk_dir}/ebt", "${bk_dir}/index", "${bk_dir}/styles");
foreach $s (@ents) {
if (!(-e $s) || -l $s || !(-d $s)) {
next; # ignore symlinks
}
rmdir($s); # ignore errors
}
if ($bk eq '') {
return;
}
#------------------------------------------
# remove old infosearch files / ignore errs
#
if (-e "${bk_dir}/${bk}.inp") {
unlink("${bk_dir}/${bk}.inp");
}
if (-e "${bk_dir}/${bk}.html") {
unlink("${bk_dir}/${bk}.html");
}
if (-e "${bk_dir}/${bk}_help.html") {
unlink("${bk_dir}/${bk}_help.html");
}
if (-e "${bk_dir}/${bk}.books.wrd") {
unlink("${bk_dir}/${bk}.books.wrd");
}
return;
}
#--------------------
# do_html(string ttl)
#
sub do_html {
my($ttl) = @_;
my($s) = $_hdr;
$s =~ s/%TTL/$ttl/g;
return "$s";
}
#----------------------
# usage(string err_msg)
#
sub usage {
my($err) = @_;
print "\nusage: insightAdmin [-c] [-d] [-v] [-h] [ <bookshelf> ]\n",
"e.g. : insightAdmin ",
"/usr/share/Insight/library/SGI_bookshelves/SGI_EndUser\n\n",
"where: -c correct my books (from old to new format)\n",
" -d use the network to connect to techpubs.sgi.com to try\n",
" to download books during a -c(orrection) of books\n",
" -v verbose mode\n",
" -h print this usage message\n",
($err ne '' ? "\n** insightAdmin ERROR:\n ${err}\n\n" : '');
exit(-1);
}
__END__
<html>
<head>
<title>SGI Desktop Techpubs Library: %TTL</title>
</head>
<body text="#000000" bgcolor="#f9f9f9">
<table BORDER="0" CELLPADDING="0" CELLSPACING="0" WIDTH="100%">
<tr bgcolor="#003399"><td colspan="2"><font size="1"> </td></tr>
<tr bgcolor="#7C7F87">
<td valign="top" align="left"><p><br>
<font face="helvetica" color="#ffffff" size="+1"><b>
SGI Desktop Techpubs Library
</b></font><br>
</p></td>
<td valign="center" align="right"><font face="helvetica" color="#ffffff"><b>
<a href="http://localhost/infosearch/"><font face="helvetica" color="#ffffff" style="text-decoration: none">infosearch</font></a>
|
<a href="http://techpubs.sgi.com/"><font face="helvetica" color="#ffffff" style="text-decoration: none">techpubs.sgi.com</font></a>
</b></font></td>
</tr>
<tr bgcolor="#003399"><td colspan="2"><font size="1"> </td></tr>
</table>
<p>
<h3>SGI Desktop Techpubs Library: %TTL</h3>
</p>